/**
 * #### 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
 * @param s 字符串
 * @param n
 * @returns
 */
export function reverseleftWord(s: string, n: number): string {
  return (s + s).slice(n, n + s.length);
}

/**
 * #### 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * @description 采用滑动窗口，时间复杂度O(n)
 * @param s 字符串
 */
export function lengthOfLongestSubstring(s: string): number {
  // 创建一个Set，用于存储不重复的字符
  const set = new Set();
  // 定义左指针、右指针、最大长度和当前长度
  let left = 0,
    right = 0,
    max = 0,
    length = 0;
  // 当右指针小于字符串长度时，循环执行
  while (right < s.length) {
    // 如果Set中没有当前字符
    if (!set.has(s[right])) {
      // 将当前字符添加到Set中
      set.add(s[right]);
      // 当前长度加1
      length++;
      // 如果当前长度大于最大长度，则更新最大长度
      if (length > max) {
        max = length;
      }
      // 右指针右移
      right++;
    } else {
      // 如果Set中有当前字符，则循环执行
      while (set.has(s[right])) {
        // 将Set中的左指针指向的字符删除
        set.delete(s[left]);
        // 左指针右移
        left++;
        // 当前长度减1
        length--;
      }
      // 将当前字符添加到Set中
      set.add(s[right]);
      // 当前长度加1
      length++;
      // 右指针右移
      right++;
    }
  }
  // 返回最大长度
  return max;
}
